#pragma once

#include <iostream>
#include <string>
#include <ctemplate/template.h>

#include "./oj_model_mysql.hpp"

namespace ns_view
{
    static const std::string template_html_path = "./template_html/";

    class view
    {
    public:
        view() {}
        ~view() {}

        void all_questions_expand_html(const std::vector<ns_model::question> &all_questions,
                                       std::string *html)
        {
            // 这个网页显示的是将所有题目形成一个列表
            // 只需要显示题目的编号,题目的标题,题目的难度
            // 这里推荐使用表格的方式进行显示

            // 形成路径,指的是被渲染的网页
            std::string src_html = template_html_path + "all_questions.html";

            // 形成数据字典
            ctemplate::TemplateDictionary root("all_questions");
            for (const auto &q : all_questions)
            { // 这个字符串的名字必须和对应的html设置循环的那个名字一样
                ctemplate::TemplateDictionary *sub = root.AddSectionDictionary("questions_list");
                sub->SetValue("number", std::to_string(q.number));
                sub->SetValue("title", q.title);
                sub->SetValue("difficulty", q.difficulty);
            }

            // 获取被渲染的html
            ctemplate::Template *templ = ctemplate::Template::GetTemplate(src_html, ctemplate::DO_NOT_STRIP);

            // 开始完成网页的渲染
            templ->Expand(html, &root);
        }

        void one_question_expand_html(const ns_model::question &ques, std::string *html)
        {
            // 形成路径,指的是被渲染的网页
            std::string src_html = template_html_path + "one_question.html";

            // 形成数据字典
            ctemplate::TemplateDictionary root("one_question");
            root.SetValue("number", std::to_string(ques.number));
            root.SetValue("title", ques.title);
            root.SetValue("difficulty", ques.difficulty);
            root.SetValue("desc", ques.desc);
            root.SetValue("prepared_code", ques.header);

            // 获取被渲染的html
            ctemplate::Template *templ = ctemplate::Template::GetTemplate(src_html, ctemplate::DO_NOT_STRIP);

            // 开始完成网页的渲染
            templ->Expand(html, &root);
        }
    };
}